"""
@Author  : 康帅
@Time    : 2021/4/14 16:13
@Function: 类方式实现多线程:耗时6s多
"""

import threading
import time

from abc import ABCMeta, abstractmethod


class Base(metaclass=ABCMeta):

    @abstractmethod
    def run(self):
        pass


class MopFloor(Base, threading.Thread):
    def __init__(self):
        super().__init__()

    def run(self):
        print('我要拖地了')
        time.sleep(1)
        print('地拖完了')


class HeatUpWater(Base, threading.Thread):
    def __init__(self, name):
        # 这里传入参数name，就是传入子线程名字
        super().__init__(name=name)
        # 记住这里的格式不能错

    def run(self):
        print('我要烧水了')
        print(self.name)
        print(threading.current_thread().name)
        # 这两个都是打印出当前子线程的名字
        time.sleep(6)
        print('水烧开了')


class TestLock(threading.Thread):
    """ 线程锁 """
    def __init__(self, lock):
        super().__init__()
        self.lock = lock

    def run(self):
        self.lock.acquire()
        pass
        self.lock.release()


if __name__ == '__main__':
    start_time = time.time()
    t1 = MopFloor()
    t2 = HeatUpWater('***我是烧水员***')
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    end_time = time.time()
    print(f'总共耗时:{end_time - start_time}')

"""
python的threading.Thread类有一个run方法，用于定义线程的功能函数，可以在自己的线程类中覆盖该方法。
而创建自己的线程实例后，通过Thread类的start方法，可以启动该线程，交给python虚拟机进行调度，
当该线程获得执行的机会时，就会调用run方法执行线程。


run方法与start方法的区别：
start() 方法是启动一个子线程，线程名就是我们定义的name
run() 方法并不启动一个新线程，就是在主线程中调用了一个普通函数而已
因此，如果你想启动多线程，就必须使用start()方法。
"""
